/**
**********************************************************************************************************************************************************************************************************************************
* @file:	StringList.h
* @author:	zinface
* @date:	2021年09月18日 16:56:02 星期六
* @brief:	FinaC 提供的 StringList 数据类型操作集
* 
* 1. createStringList(): 
* 2. stringListLength(StringList *): 
* 3. stringListAppend(StringList *, String *): 
* 4. stringListAppendCopy(StringList *, String *): 
**********************************************************************************************************************************************************************************************************************************
**/

#ifndef __STRINGLIST__H__
#define __STRINGLIST__H__

#include "String.h"

FinalC_Object_Define(StringList) {
    String *string;
    StringList *next;
    StringList *parent;
};
// FinalC_Object_Size(StringList);

#define FinalC_StringList_Func_Define(func) \
    FinalC_Object_Func_Suffix(stringList, func)

// ------------------------------------ Constructor
/**
 * createStringList: 创建空的 StringList 对象实例
 *
 */
FINALC_WARN_UNUSED_RESULT
FinalC_Object_Create_Define(StringList);
/**
 * createStringListWithString: 基于给定的 String 创建 StringList 对象实例
 *
 */
FINALC_WARN_UNUSED_RESULT
FinalC_Object_Create_With_Obj_Define(StringList, String);

// ------------------------------------ Destructor

void destroyStringList(StringList *array);

void deleteStringListWithFunc(StringList *array, FinalCDeleteFunc deleteFunc);
void deleteStringList(StringList *array);

// ------------------------------------ Exstenstion Func: foreach
void finalc_stringlist_foreach(StringList *array, FinalCFunc func, void *data);
/*******************************************************************/
// #define LIST_FOREACH(var, head, field)                  \
//     for((var) = LIST_FIRST(head);                       \
//         (var);                                          \
//         (var) = LIST_NEXT((var), field))

// FinalC List Foreach
#define stringlist_foreach(var, head)                  \
    for((var) = head;                       \
        (var);                                          \
        (var) = var->next)
/*******************************************************************/

// ------------------------------------ Exstenstion Func: Length

int stringListLength(StringList *array);

// ------------------------------------ Exstenstion Func: Last

StringList *stringListLast(StringList *array);

String *stringListLastString(StringList *array);

// ------------------------------------ Exstenstion Func: Append
FINALC_WARN_UNUSED_RESULT
StringList *FinalC_StringList_Func_Define(Prepend)(StringList *array, String *string);

FINALC_WARN_UNUSED_RESULT
StringList *FinalC_StringList_Func_Define(Append)(StringList *array, String *string);

// StringList *stringListAppendCopy(StringList *array, String *string);

// ------------------------------------ Exstenstion Func: String Split To StringList

FINALC_WARN_UNUSED_RESULT
// StringList *createStringListWithSplit(String *s, char value);
StringList* createStringListWithSplit(const String *s, const char value);
FINALC_WARN_UNUSED_RESULT
StringList* createStringListWithSplits(const String *s, const char *value);
FINALC_WARN_UNUSED_RESULT
StringList* createStringListWithSplit_cnt(const String *s, const char value, int cnt);

// ------------------------------------ Exstenstion Func: String Split To StringList With After

FINALC_WARN_UNUSED_RESULT
StringList* createStringListWithSplitAfter(String *v, const char value, afterdeleteString after);
StringList* createStringListWithSplitsAfter(String *v, const char *value, afterdeleteString after);
StringList* createStringListWithSplit_cntAfter(String *v, const char value, int cnt, afterdeleteString after);

// ------------------------------------ Exstenstion Func: Index
const StringList *FinalC_StringList_Func_Define(Index)(StringList *array, int index);

#endif  //!__STRINGLIST__H__
